package com.yt.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 高德地图工具类
 * 提供地址编码、逆编码等服务
 */

/**
 * 高德地图工具类
 * 提供地址编码、逆编码等服务
 */
import com.yt.common.utils.StrUtils;
import com.yt.common.utils.HttpClientUtil;

/**
 * 高德地图工具类
 * 提供地址编码、逆编码等服务
 */
@Slf4j
public class AmapUtils {
    
    /**
     * 高德地图API Key
     * 实际项目中应该从配置文件中读取
     */
    private static final String API_KEY = "a8cf1c4dfdc52c5c295f2713d0ec434c";
    
    /**
     * 高德地图地理编码API地址
     */
    private static final String GEO_CODE_URL = "https://restapi.amap.com/v3/geocode/geo";
    
    /**
     * 根据地址获取经纬度坐标
     * 
     * @param address 地址信息
     * @return 经纬度坐标，格式为[经度, 纬度]，获取失败时返回null
     */
    public static BigDecimal[] getCoordinatesByAddress(String address) {
        if (StrUtils.isEmpty(address)) {
            log.warn("地址信息为空，无法获取坐标");
            return null;
        }
        
        try {
            // 构建请求参数
            Map<String, String> params = new HashMap<>();
            params.put("key", API_KEY);
            params.put("address", address);
            
            // 构建带参数的URL
            StringBuilder urlBuilder = new StringBuilder(GEO_CODE_URL);
            urlBuilder.append("?");
            for (Map.Entry<String, String> entry : params.entrySet()) {
                urlBuilder.append(entry.getKey())
                        .append("=")
                        .append(entry.getValue())
                        .append("&");
            }
            // 删除最后一个多余的&
            urlBuilder.deleteCharAt(urlBuilder.length() - 1);
            
            // 发送HTTP请求
            String response = HttpClientUtil.getInstance().sendHttpGetJson(urlBuilder.toString());
            
            // 解析响应结果
            JSONObject jsonResponse = JSON.parseObject(response);
            
            // 检查响应状态
            String status = jsonResponse.getString("status");
            if (!"1".equals(status)) {
                String errorMsg = jsonResponse.getString("info");
                log.error("高德地图API调用失败，错误信息: {}", errorMsg);
                return null;
            }
            
            // 获取地理编码结果
            JSONArray geocodes = jsonResponse.getJSONArray("geocodes");
            if (geocodes == null || geocodes.isEmpty()) {
                log.warn("未找到地址'{}'对应的地理编码信息", address);
                return null;
            }
            
            // 获取第一个结果的经纬度
            JSONObject geocode = geocodes.getJSONObject(0);
            String location = geocode.getString("location");
            
            if (StrUtils.isEmpty(location)) {
                log.warn("地址'{}'的地理编码结果中不包含位置信息", address);
                return null;
            }
            
            // 解析经纬度
            String[] coordinates = location.split(",");
            if (coordinates.length != 2) {
                log.warn("地址'{}'的地理编码结果格式不正确: {}", address, location);
                return null;
            }
            
            BigDecimal longitude = new BigDecimal(coordinates[0]);
            BigDecimal latitude = new BigDecimal(coordinates[1]);
            
            log.info("成功获取地址'{}'的地理坐标: 经度={}, 纬度={}", address, longitude, latitude);
            return new BigDecimal[]{longitude, latitude};
        } catch (Exception e) {
            log.error("通过高德地图API获取地址'{}'的地理坐标时发生异常", address, e);
            return null;
        }
    }
}